package com.css.sword.knowing.toolkit.object;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 作者 E-mail:caihx@css.com.cn
 * @date 创建时间：2017年5月17日 下午3:28:15
 * @version 1.0
 */
public class CssObjectInfo {
	/**
	 * 根据对象属性名获取属性值
	 * 
	 * @param fieldName
	 *            属性名称
	 * @param o
	 *            对象
	 * @return 属性值
	 */
	private Object getFieldValueByName(String fieldName, Object o) {
		try {
			Method[] methods = o.getClass().getMethods();

			String firstLetter = fieldName.substring(0, 1).toUpperCase();
			String getter = "get" + firstLetter + fieldName.substring(1);
			String is = "is" + firstLetter + fieldName.substring(1);
			for (Method method : methods) {
				if (getter.equals(method.getName()) || is.equals(method.getName()))
					return method.invoke(o, new Object[] {});
			}
		} catch (Exception e) {
			// log.error(e.getMessage(),e);
			return null;
		}
		return null;
	}

	/**
	 * 获取对象所有属性名称
	 * 
	 * @param o
	 *            对象名称
	 * @return 属性数组
	 */
	private String[] getFiledNames(Object o) {
		Field[] fields = o.getClass().getDeclaredFields();
		String[] fieldNames = new String[fields.length];
		for (int i = 0; i < fields.length; i++) {
			System.out.println(fields[i].getType());
			fieldNames[i] = fields[i].getName();
		}
		return fieldNames;
	}

	/**
	 * 获取属性类型(type)，属性名(name)，属性值(value)的map组成的list
	 * 
	 * @param o
	 *            对象名称
	 * @return 返回Map列表
	 */
	public List<Map> getFiledsInfo(Object o) {
		Field[] fields = o.getClass().getDeclaredFields();
		List<Map> list = new ArrayList<Map>();
		Map infoMap = null;
		for (int i = 0; i < fields.length; i++) {
			infoMap = new HashMap();
			infoMap.put("type", fields[i].getType().toString());
			infoMap.put("name", fields[i].getName());
			infoMap.put("value", getFieldValueByName(fields[i].getName(), o));
			list.add(infoMap);
		}
		return list;
	}

	/**
	 * 获取对象的所有属性值
	 * 
	 * @param o
	 *            对象名称
	 * @return 返回一个对象数组
	 */
	public Object[] getFiledValues(Object o) {
		String[] fieldNames = this.getFiledNames(o);
		Object[] value = new Object[fieldNames.length];
		for (int i = 0; i < fieldNames.length; i++) {
			value[i] = this.getFieldValueByName(fieldNames[i], o);
		}
		return value;
	}
}
